'use strict';
import Vue from 'vue';
import axios from 'axios'; // 引入axios组件
import qs from 'qs';
// import querystring from 'querystring'; // 使用体积更小的querystring替代qs以进行表单提交
import vueJsonp from 'vue-jsonp'; // 引入jsonp方法
import { Message } from 'element-ui';
import Router from '@/view/base/router';
// 创建axios实例
const http = axios.create({
  baseURL: process.env.baseURL, // api的base_url
  timeout: 20000, // 请求超时时间
  // 设置post类型
  // headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest', 'localReferer': '127.0.0.1' }
  headers: {
    'Content-Type': 'application/json; charset=utf-8'
  }
});
// vue-jsonp的调用方式和axios一致
// 因为vue-json是一个vue插件，所以需要用hack的方式主动调用install方法进行安装
// 添加jsonp方法, 默认超时时间:20s
vueJsonp.install(http, 20000);
// http请求拦截器
http.interceptors.request.use(
  config => {
    // 非生产环境, 接口前缀统一使用[/api]前缀做代理拦截!
    if (process.env.NODE_ENV !== 'production') {
      config.url = '/api' + config.url;
    }
    config.headers['authToken'] = Vue.cookie.get('token');// 请求头带上token
    if (config.method === 'get') {
      config.params = config.params || {};
      config.paramsSerializer = function(params) {
        return qs.stringify(params, { arrayFormat: 'repeat' });
      };
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// respone拦截器
http.interceptors.response.use(
  // 响应成功
  response => {
    const { data } = response;
    if (response.status === 200) {
      if (data.success === false) {
        Message.error(data.message);
        if (data.code === 10001) {
          Router.push({
            path: '/login'
          });
        }
      }
      return data;
    } else {
      return response;
    }
  },

  // 响应失败
  error => {
    // 一般情况下，只要服务器返回的状态码不是2XX或者304,都会报这个错误
    let returnError = error;
    if (error.response) {
      returnError = error.response;
    } else {
      returnError = Promise.reject(error);
    }
    return returnError;
  }
);

export default http;
